package com.hunzi.service.impl;

import com.hunzi.domain.ItemCat;
import com.hunzi.mapper.ItemCatMapper;
import com.hunzi.service.ItemCatService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import java.util.List;

@Service
@Transactional
public class ItemCatServiceImpl implements ItemCatService {

    @Autowired(required = false)
    private ItemCatMapper itemCatMapper;

    //注入redis模板
    @Autowired
    private RedisTemplate redisTemplate ;



    @Override
    public int deleteByPrimaryKey(Integer cid) {
        return 0;
    }

    @Override
    public int insert(ItemCat record) {
        return 0;
    }

    //根据商品分类信息查询商品
    @Override
    public ItemCat selectByPrimaryKey(Integer cid) {
        return itemCatMapper.selectByPrimaryKey ( cid );
    }

    @Override
    public List<ItemCat> selectAll() {
        return null;
    }

    @Override
    public int updateByPrimaryKey(ItemCat record) {
        return 0;
    }

    //优化方法 ，加入缓存
    @Override
    public List<ItemCat> selectAllByStatus(int status) {
        
 //方式二 ： 使用 redis缓存的
  /*      List<ItemCat> itemCats = null;
        // 快捷键： ctrl+alt+t
        try {
            //1.先根据key值 从redis缓存中取出分类的集合
            itemCats = (List<ItemCat>) redisTemplate.opsForList ().leftPop ( "itemCats" );

            //2.根据判断，如果取出来的集合为空就从数据库中进行查询
            if (StringUtils.isEmpty ( itemCats )){
                 //2.1说明没有缓存， 先从数据库中查询数据
                 itemCats = itemCatMapper.selectAllByStatus ( status );
                 //2.2 然后将集合中的数据缓存到redis中
                redisTemplate.opsForList ().leftPush ( "itemCats" , itemCats );

            }
        } catch (Exception e) {
            //如果redis服务器出现问题需要再次重数据库中查询分类集合
            itemCats = itemCatMapper.selectAllByStatus ( status );
            e.printStackTrace ();
        }

        //3.返回 itemCats 集合
        return  itemCats;*/
  
  
//方式一：不使用redis缓存
//    return itemCatMapper.selectAllByStatus ( status ) ;
       
//方式三：使用redis缓存 更好的方法
        //先从redis中取出缓存集合
        //k 表示的是缓存分类集合的键值， 0 表示开始 ， -1表示结束 0到-1表示取出集合中所有的元素
        try {
            List itemCats = null ;
            itemCats = redisTemplate.opsForList ().range ( "itemCats", 0, -1 );
            //判断集合是否为空或为0个元素
            if (itemCats==null || itemCats.size ()==0){
                //redis没有缓存分类信息
                //先从数据库中取出分类信息的集合
                    itemCats = itemCatMapper.selectAllByStatus ( status );
                //将分类信息的集合缓存到redis中
                 redisTemplate.opsForList ().leftPush ( "itemCats", itemCats );
                 return itemCats ;
            }else{
                //redis中已经缓存该商品的集合了
                //直接从redis缓存中取出集合信息 只需要取出List中的第一元素就可以了
                  itemCats = (List) itemCats.get ( 0 );
                  //返回商品分类的集合
                  return itemCats ;
            }
        } catch (Exception e) {
            //e.printStackTrace();
            //如果出现异常 就直接从数据库中 取出分类信息 返回就行
            List<ItemCat> itemCats = itemCatMapper.selectAllByStatus ( status );
            return itemCats ;
        }

    }


}
